package br.com.JZSolution.domineduplex.modelo;

import java.io.File;
import java.util.Date;

import javax.swing.JLabel;
import javax.swing.SwingConstants;

import br.com.JZSolution.domineduplex.DomineDuplex;
import br.com.JZSolution.domineduplex.gui.MainFrame;
import br.com.JZSolution.domineduplex.gui.paineltransferencia.FileProgress;
import br.com.JZSolution.domineduplex.utils.ConversorDeUnidades;

public class Transferencia {
	
	public static final int UP = 1;
	public static final int DOWN = 2;
	
	public static final int ATIVA = 1;
	public static final int AGUARDANDO = 2;
	public static final int PAUSADA = 3;
	public static final int PARADA = 4;
	public static final int CANCELADA = 5;
	public static final int CONCLUIDA_SUCESSO = 6;
	public static final int CONCLUIDA_FALHA = 7;
	
	private String remetente;
	private String destinatario;
	private long data; //data inicial 
	private long tempoAtivo;//tempo que esta ativa
	private int tipo; //Upload ou donwload
	private float velocidade;
	private int estado; //Ativa não ativa, aguardando, ou outros ...
	private long tamanho; // Bytes
	private long bytesTransferidos;//quantos bytes foram lidos ou escritos
	private File arquivo;
	private FileProgress progress = null; //Notificador interface
	private JLabel labelVel;
	/**
	 * Constroi uma tranferência do tipo Download, cria o progress bar com o arquivo passado.<br>
	 * Chamado pelo Destinatario.
	 * @param arquivo, arquivo que será tranferido
	 * @param tamanhoArquivo, tamanho do arquivo que será baixado
	 * @param rementente
	 * @param destinatario
	 */
	public Transferencia(File arquivo, long tamanhoArquivo,String rementente,String destinatario) {
		this.arquivo = arquivo;
		this.tamanho = tamanhoArquivo;
		this.tipo = Transferencia.DOWN;
		this.remetente = rementente;
		this.destinatario = destinatario;
		this.progress = new FileProgress(tamanho);
		finalizarInstanciacao();
	}
	
	/**
	 * Constroi uma tranferência do tipo Upload, cria o progress bar com o arquivo passado.<br>
	 * Chamado pelo Remetente.
	 * @param arquivo, arquivo que será tranferido
	 * @param rementente
	 * @param destinatario
	 */
	public Transferencia(File arquivo,String rementente,String destinatario) {
		this.arquivo = arquivo;
		this.tamanho = arquivo.length();
		this.tipo = Transferencia.UP;
		this.remetente = rementente;
		this.destinatario = destinatario;
		this.progress = new FileProgress(arquivo);
		finalizarInstanciacao();
	}
	
	private void finalizarInstanciacao(){
		
		this.data = new Date().getTime();
		this.tempoAtivo = 0;
		this.velocidade = 0.0f;
		this.estado = AGUARDANDO;
		this.labelVel = new JLabel("0 KBps");
		labelVel.setHorizontalAlignment(SwingConstants.RIGHT);
		
		MainFrame mainFrame = DomineDuplex.getInstance().getMainframe();
		mainFrame.getTransferPanel().getTransferTable().getModel().addElement(this);
		mainFrame.getTransferPanel().getTransferTable().revalidate();
	}
	
	public void atualizarInterface(int totalLido){
		progress.atualizarProgress(totalLido);
		//DomineDuplex.getInstance().getMainframe().getTransferPanel().getTransferTable().repaint();
	}
	
	public String getRemetente() {
		return remetente;
	}
	public void setRemetente(String remetente) {
		this.remetente = remetente;
	}
	public String getDestinatario() {
		return destinatario;
	}
	public void setDestinatario(String destinatario) {
		this.destinatario = destinatario;
	}
	public long getData() {
		return data;
	}
	public void setData(long data) {
		this.data = data;
	}
	public long getTempoAtivo() {
		return tempoAtivo;
	}
	public void setTempoAtivo(long tempoAtivo) {
		this.tempoAtivo = tempoAtivo;
	}
	public int getTipo() {
		return tipo;
	}
	/**
	 * public static final int UP = 1; upload
	 * public static final int DOWN = 2; download
	 * @param tipo
	 */
	public void setTipo(int tipo) {
		this.tipo = tipo;
	}
	public float getVelocidade() {
		return velocidade;
	}
	public void setVelocidade(float velocidade) {
		this.velocidade = velocidade;
		this.labelVel.setText(ConversorDeUnidades.tratarVelocidade(velocidade));
	} 
	public int getEstado() {
		return estado;
	}
	
	/**
	 * public static final int ATIVA = 1;
	 * public static final int AGUARDANDO = 2;
	 * public static final int PAUSADA = 3; 
	 * public static final int PARADA = 4;
	 * public static final int CANCELADA = 5;  
	 * @param estado
	 */
	public void setEstado(int estado) {
		this.estado = estado;
	}
	public long getTamanho() {
		return tamanho;
	}
	public void setTamanho(long tamanho) {
		this.tamanho = tamanho;
	}
	public File getArquivo(){
		return arquivo;
	}
	public void setArquivo(File file){
		this.arquivo = file;
	}

	public FileProgress getFileProgress() {
		return progress;
	}
	
	public long getBytesTransferidos() {
		return bytesTransferidos;
	}
	
	public void setBytesTransferidos(long bytesTransferidos) {
		this.bytesTransferidos = bytesTransferidos;
	}
	public JLabel getLabelVel() {
		return labelVel;
	}
}
